//École de Technologie Supérieure (ÉTS)
//LOG720 - Laboratoire 2  - J2EE
//Date de remise: 2011-11-14
//Auteurs:
//Jonathan Aubuchon (AUBJ18038704)
//Jeff Grenier (GREJ02098703)
//Francis Paré (PARF21038708)

package ca.etsmtl.log720.lab2.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

/*import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;*/

import ca.etsmtl.log720.lab2.beans.Dossier;
import ca.etsmtl.log720.lab2.beans.NoPermisInvalideException;

/*
 * Data Acces Object pour les dossiers
 */
public class DossierDAO {
	static DossierDAO instance=new DossierDAO();
	private DossierDAO(){}
	
	/**
	 * retourne l'instance du DAO
	 * @return 
	 */
	public static DossierDAO getInstance(){
		return instance;
	}
	
	/**
	 * Retourne la totalité des dossiers sous la forme d'une collection de dossiers.
	 * @return 
	 */
	public ArrayList<Dossier> selectDossiers(){
		
		Connection dataSourceConnection= DBConnection.getInstance().getConnection();
		
		ArrayList<Dossier> linkedDossiers=null;
		
		try {
			PreparedStatement selectStatement = dataSourceConnection.prepareStatement ("SELECT * FROM dossier");
			
			ResultSet dossierSet = selectStatement.executeQuery();

			linkedDossiers = new ArrayList<Dossier>();
			while (dossierSet.next()) { 
				int id = dossierSet.getInt("id");
				String nom = dossierSet.getString("nom");
				String prenom = dossierSet.getString("prenom");
				String nopermis = dossierSet.getString("nopermis");
				String noplaque = dossierSet.getString("noplaque");
				Dossier  dossier  = new Dossier (id,nom,prenom,nopermis,noplaque);
				
				dossier.set_maxNiveau(InfractionDAO.getInstance().selectMaxNiveauInfraction(id));
				
				linkedDossiers.add (dossier);
			}
			//dataSourceConnection.close();

		} catch (SQLException e) {
			e.printStackTrace();
		}
		return linkedDossiers;
	}
	
	/**
	 * retourne un dossier en fonction du ID fournit
	 * @param dossierID
	 * @return
	 */
	public Dossier selectDossier(int idDossier){
		Connection dataSourceConnection=DBConnection.getInstance().getConnection();
		Dossier dossier=null;
		try {
					
			PreparedStatement selectStatement = dataSourceConnection.prepareStatement ("SELECT * FROM dossier WHERE id=?");
			selectStatement.setInt(1, idDossier);
			
			ResultSet dossierSet = selectStatement.executeQuery();

			dossierSet.next();
			int id = dossierSet.getInt("id");
			String nom = dossierSet.getString("nom");
			String prenom = dossierSet.getString("prenom");
			String nopermis = dossierSet.getString("nopermis");
			String noplaque = dossierSet.getString("noplaque");
			dossier = new Dossier (id,nom,prenom,nopermis,noplaque);
			dossier.set_maxNiveau(InfractionDAO.getInstance().selectMaxNiveauInfraction(id));
			
		}catch (SQLException e) {
			e.printStackTrace();
		}
		return dossier;
	}
	
	
	/**
	 * Ajoute un nouveau dossier au système.
	 * Retourne true si l'ajout a fonctionné, sinon false en cas d'échec
	 * @param infraction
	 * @return
	 */
	public boolean insertDossier(Dossier dossier) 
		throws NoPermisInvalideException{
		Connection dataSourceConnection= DBConnection.getInstance().getConnection();

		try {
			PreparedStatement selectStatement1 = dataSourceConnection.prepareStatement (
				"SELECT COUNT(nopermis)=1 AS existe FROM dossier WHERE noplaque=?");

		selectStatement1.setString(1, dossier.getNoPlaque());
		ResultSet result = selectStatement1.executeQuery();
		result.next();
		if(result.getBoolean("existe")==true)
			throw new NoPermisInvalideException();
		
		

			PreparedStatement selectStatement = dataSourceConnection.prepareStatement (
					"INSERT INTO dossier(id,nom,prenom,nopermis,noplaque) VALUES(DEFAULT,?,?,?,?)");

			selectStatement.setString(1, dossier.getNom());
			selectStatement.setString(2, dossier.getPrenom());
			selectStatement.setString(3, dossier.getNoPermis());
			selectStatement.setString(4, dossier.getNoPlaque());
			
			selectStatement.execute();
				
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}
	
	/**
	 * Ajoute une nouvelle infraction à un dossier.
	 * Retourne true si l'ajout a fonctionné, sinon false en cas d'échec
	 * @param infraction
	 * @return
	 */
	public boolean insertInfractionAuDossier(int dossierID, int infractionID){
		Connection dataSourceConnection= DBConnection.getInstance().getConnection();
		try {

			PreparedStatement selectStatement = dataSourceConnection.prepareStatement (
					"INSERT INTO dossier_infraction(iddossier,idinfraction) VALUES(?,?)");

			selectStatement.setInt(1,dossierID);
			selectStatement.setInt(2,infractionID);

			selectStatement.execute();
				
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}

}
